package com.mastercard.assets.web.struts.actions;

import java.io.IOException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.jpa.TblAlertaUsuario;
import com.mastercard.assets.jpa.TblFormaAlerta;
import com.mastercard.assets.jpa.TblTipoCuenta;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.CuentaElegidaForm;
import com.mastercard.assets.web.util.to.UserLogin;
import java.util.ArrayList;
import java.util.List;

public class CuentaElegida
	extends
		Action
{
	public ActionForward execute(
							ActionMapping mapping , 
							ActionForm form ,
							HttpServletRequest request , 
							HttpServletResponse response )
		throws 
			IOException , 
			ServletException
	{
		HttpSession session = request.getSession( ) ;
		
		// en caos de null
		if( session == null )
			return mapping.findForward( "noLogin" ) ;
		
		// toma el userLogin
		UserLogin user = ( UserLogin ) session.getAttribute( "UserLogin" ) ;
		
		// en caso de null
		if( user == null )
			return mapping.findForward( "noLogin" ) ;
		
		CuentaElegidaForm f = ( CuentaElegidaForm ) form ;
		
		try
		{
                    if( user.getActualRoleId( ) != 5 ){
                        // realiza la actualizacion del rol
			user.setActualCountId( f.getCount( ) ) ;
                    }else
                        if( user.getActualRoleId( ) == 5 ){
                            TblTipoCuenta tipoCuenta = MasterCardDAO.findTypeCountById( f.getCount( ) ) ;
                             user.setCountType( tipoCuenta ) ;
                        }
                    
// ___________________________________________      Calcula alertas     ___________________________________________
List<TblAlertaUsuario> sinLeer = MasterCardDAO.getNoLeidas( user.getCveUsuario( ) ) ; // user.getAlertsNotReaded( ) ;
int cuentaAlerta = 0, cuenta = user.getActualCountId( ) ;
        

List< TblAlertaUsuario> resSinLeer = new ArrayList< TblAlertaUsuario>();

// valida el rol
if (user.getActualRoleId( ) == 2) {
    // recorre alertas sin leer
    for (TblAlertaUsuario alert : sinLeer) {
        int clvRol = 0;

        // la alerta debe tener la clave del usuario
        if (alert.getTblUsuario().getCveUsuario() == user.getCveUsuario( )) {
            
            if( alert.getTblNotificacion( ) == null ){
                List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                for( TblFormaAlerta FA : fa ){
                    
                    if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&( FA.getTblRole( ).getCveRole( ) == user.getActualRoleId( ) ) ){
                        resSinLeer.add(alert);
                    }
                }
            }else{
                
                int alNot = alert.getTblNotificacion().getTblRole().getCveRole();                        

                if (alNot == user.getActualRoleId( )) {
                    clvRol = 1;
                }

                if (clvRol == 1) {
                    resSinLeer.add(alert);
                }
                            
            }
          }
       }

} else {
    
    // recorre alertas sin leer
    for (TblAlertaUsuario alert : sinLeer) {
        int clvRol = 0;
        // si tiene numero de cuenta
        if (alert.getTblCuenta() != null) {
            cuentaAlerta = alert.getTblCuenta().getCveCuenta();
                    
            // la alerta debe tener la clave del usuario
            if (alert.getTblUsuario().getCveUsuario() == user.getCveUsuario( ) && cuentaAlerta == cuenta) {
                
                if( alert.getTblNotificacion( ) == null ) {
                    
                    List< TblFormaAlerta > fa = alert.getTblAlerta( ).getTblFormaAlertas( ) ;
                            
                    for( TblFormaAlerta FA : fa ) {
                        if( ( FA.getTipo( ) == 3 || FA.getTipo( ) == 2 ) &&( FA.getTblRole( ).getCveRole( ) == user.getActualRoleId( ) ) ) {
                            resSinLeer.add(alert);
                        }
                    }
                }else{
                    
                    int alNot = alert.getTblNotificacion().getTblRole().getCveRole();
                    
                    if (alNot == user.getActualRoleId( )) {
                        clvRol = 1;
                    }

                    if (clvRol == 1) {
                        resSinLeer.add(alert);
                    }
                    
                            
                }
            }
        }// sin no tiene numero de ceunta
         else
            if ( alert.getTblNotificacion().getTblRole().getCveRole() == user.getActualRoleId( )
                    && alert.getTblUsuario().getCveUsuario() == user.getCveUsuario( ) 
                    && alert.getLeida() == 1 && (alert.getTblNotificacion().getTipoNotificacion() > 6 ||
                    alert.getTblNotificacion().getTipoNotificacion() == 1 || alert.getTblNotificacion().getTipoNotificacion() == 2 ) )
                
                resSinLeer.add(alert);

            }

        }

user.setNumAler( resSinLeer.size( ) ) ;
// ___________________________________________      Calcula alertas     ___________________________________________                           
			
		}catch( MasterCardException mce )
		{
                    MasterCardDAO.closeEntityManager( ) ;
			// en caso de error, revisa el error
			switch( mce.getErrorCode( ) )
			{
				case MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_USER_MUST_BE_LOGGEDIN : 
				case MCUtil.MASTERCARD_ERROR_CODE_USERLOGIN_USER_THERE_IS_NO_EXIST_THAT_COUNT :
					return mapping.findForward( "noLogin" ) ;
			}
		}
		
                MasterCardDAO.closeEntityManager( ) ;
	  	return mapping.findForward( "success" ) ;
	}
}
